/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the demonstration applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.  For licensing terms and
** conditions see http://qt.digia.com/licensing.  For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights.  These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "QxMenuContent.hpp"
#include "QxColors.hpp"
#include "QxMenuManager.hpp"
#include "QxDemoTextItem.hpp"
#include "QxHeadingItem.hpp"

#include <Base/QxAbstractPlugin.hpp>

QxMenuContentItem::QxMenuContentItem( const QDomElement& el, QGraphicsScene* scene, QGraphicsItem* parent )
  : QxDemoItem( scene, parent )
{
  this->name         = el.attribute( "name" );
  this->heading      = 0;
  this->description1 = 0;
  this->description2 = 0;

  if( el.tagName() == "demos" ) {
    this->readmePath = QLibraryInfo::location( QLibraryInfo::DemosPath ) + "/README";
  } else {
    this->readmePath = QLibraryInfo::location( QLibraryInfo::ExamplesPath ) + "/" + el.attribute("dirname") + "/README";
  }
}

QxMenuContentItem::QxMenuContentItem( const QxAbstractPlugin* el, QGraphicsScene* scene, QGraphicsItem* parent )
  : QxDemoItem( scene, parent )
{
  this->name         = el->name();
  this->heading      = 0;
  this->description1 = 0;
  this->description2 = 0;

  //if( el.tagName() == "demos" ) {
  //  this->readmePath = QLibraryInfo::location( QLibraryInfo::DemosPath ) + "/README";
  //} else {
  //  this->readmePath = QLibraryInfo::location( QLibraryInfo::ExamplesPath ) + "/" + el.attribute("dirname") + "/README";
  //}
}

void QxMenuContentItem::prepare()
{
  if( !this->prepared ) {
    this->prepared= true;
    this->createContent();
  }
}

void QxMenuContentItem::animationStopped( int id )
{
  if( this->name == QxColors::rootMenuName ) {
    return; // Optimization hack.
  }

  if( id == QxDemoItemAnimation::ANIM_OUT ) {
    // Free up some memory:
    delete this->heading;
    delete this->description1;
    delete this->description2;
    this->heading      = 0;
    this->description1 = 0;
    this->description2 = 0;
    this->prepared     = false;
  }
}

QString QxMenuContentItem::loadDescription( int startPara, int nrPara )
{
  QString result;
  QFile readme( readmePath );
  if( readmePath.isEmpty() || !readme.open( QFile::ReadOnly ) ) {
    if( QxColors::verbose ) {
      qDebug() << "- QxMenuContentItem::loadDescription: Could not load:" << readmePath;
    }
    return "";
  }

  QTextStream in( &readme );
  // Skip a certain number of paragraphs:
  while( startPara ) {
    if( in.readLine().isEmpty() ) {
      --startPara;
    }
  }

  // Read in the number of wanted paragraphs:
  QString line = in.readLine();
  do {
    result += line + " ";
    line = in.readLine();
    if( line.isEmpty() ) {
      --nrPara;
      line = "<br><br>" + in.readLine();
    }
  } while( nrPara && !in.atEnd() );

  return QxColors::contentColor + result;
}

void QxMenuContentItem::createContent()
{
  // Create the items:
  this->heading = new QxHeadingItem( this->name, this->scene(), this );
  QString para1 = this->loadDescription( 0, 1 );
  if( para1.isEmpty() ) {
    para1 = QxColors::contentColor + QLatin1String( "Could not load description. Ensure that the documentation for Qt is built." );
  }
  QColor bgcolor = QxColors::sceneBg1.darker( 200 );
  bgcolor.setAlpha( 100 );
  this->description1 = new QxDemoTextItem( para1, QxColors::contentFont(), QxColors::heading, 500, this->scene(), this, QxDemoTextItem::STATIC_TEXT );
  this->description2 = new QxDemoTextItem( this->loadDescription( 1, 2 ), QxColors::contentFont(), QxColors::heading, 250, this->scene(), this, QxDemoTextItem::STATIC_TEXT );

  // Place the items on screen:
  this->heading->setPos( 0, 3 );
  this->description1->setPos( 0, this->heading->pos().y() + this->heading->boundingRect().height() + 10 );
  this->description2->setPos( 0, this->description1->pos().y() + this->description1->boundingRect().height() + 15 );
}

QRectF QxMenuContentItem::boundingRect() const
{
  return QRectF(0, 0, 500, 350);
}
